from datetime import datetime, timedelta, time
from config_loader import load_config
from service.handler import mysql_db, get_sign_in_alarms, PREFIX_STR, weekday_dict, send_to_server_chan, \
    alarms_status_reset, get_all_alarms

# 加载配置
cfg = load_config("config.yml")
SERVER_CHAN_KEY = cfg["SERVER_CHAN_KEY"]


# server酱消息推送【今日打卡】
def alarms_task_today_server_chan():
    # 获取今天的日期和星期
    today = datetime.now()
    weekday = '每周' + weekday_dict[today.strftime('%A')]
    date = '每月' + today.strftime('%d') + '号'
    # 获取当前时间
    now = datetime.now()
    # 计算当前时间到第二天00:00的秒数
    seconds_to_midnight = (datetime.combine(now.date() + timedelta(days=1), time(0)) - now).total_seconds()
    # 从数据库中获取所有打卡类型的事件,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_sign_in_alarms(conn)
    # 否则，收集所有的闹钟事件
    alarms_str = []
    # 在开头添加一个大标题
    # 在开头添加一个大标题
    alarms_str.append('😂😂😂今日打卡😂😂😂  \n' + PREFIX_STR + '  \n')
    for alarm in alarms:
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%m月%d日').date().replace(year=2023)
        end_date_obj = datetime.strptime(alarm[2], '%m月%d日').date().replace(year=2023)
        if start_date_obj <= now.date() <= end_date_obj:
            if alarm[4] == '每天' or alarm[4] == weekday or alarm[4] == date:
                # 将每个闹钟的信息分别添加到列表中
                alarm_info = f"【{alarm[8]}】{alarm[5]}  \n" + f"【内容】{alarm[6]}  \n" + f"【直达】{alarm[7]}  \n" + PREFIX_STR + '  \n'
                alarms_str.append(alarm_info)
            else:
                continue
        else:
            continue
    # 使用join()函数，将列表中的每个元素连接成一个字符串，每个元素之间用换行符分隔
    response = ''.join(alarms_str)
    if len(alarms_str) > 1:
        # 发送结果给用户
        # send_text_msg(ROBOT_WXID, TO_WXID, response)

        # server酱推送
        send_to_server_chan(SERVER_CHAN_KEY, "Today ToDoList", response)
    else:
        print('今天没有打卡任务要做！')


# server酱消息推送【明日打卡提醒】
def alarms_task_tomorrow_server_chan():
    print("打卡闹钟定时任务已开启......")
    # 获取明天的日期和星期
    tomorrow = datetime.now() + timedelta(days=1)
    weekday_tomorrow = '每周' + weekday_dict[tomorrow.strftime('%A')]
    date_tomorrow = '每月' + tomorrow.strftime('%d') + '号'
    # 获取当前时间
    now = datetime.now()
    # 计算当前时间到第二天00:00的秒数
    seconds_to_midnight = (datetime.combine(now.date() + timedelta(days=1), time(0)) - now).total_seconds()
    # 从数据库中获取所有打卡类型的事件,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_sign_in_alarms(conn)
    print('alarms=', alarms)
    # 否则，收集所有的闹钟事件
    alarms_str = []
    # 在开头添加一个大标题
    alarms_str.append('😘😘😘明日打卡预告😘😘😘' + chr(13) + PREFIX_STR + chr(13))
    for alarm in alarms:
        # 将闹钟的时间（当天的秒数）转换为具体的时间
        # alarm_time = datetime.combine(now.date(), time(0)) + timedelta(seconds=alarm[3])
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%m月%d日').date().replace(year=2023)
        end_date_obj = datetime.strptime(alarm[2], '%m月%d日').date().replace(year=2023)
        alarm_date = now.date() + timedelta(days=1)
        if start_date_obj <= alarm_date <= end_date_obj:
            if alarm[4] == '每天' or alarm[4] == weekday_tomorrow or alarm[4] == date_tomorrow:
                # 将每个闹钟的信息分别添加到列表中
                alarm_info = f"【{alarm[8]}】{alarm[5]}" + chr(13) + f"【内容】{alarm[6]}" + chr(
                    13) + f"【直达】{alarm[7]}" + chr(
                    13) + PREFIX_STR + chr(13)
                alarms_str.append(alarm_info)
            else:
                continue
        else:
            continue
    # 使用join()函数，将列表中的每个元素连接成一个字符串，每个元素之间用换行符分隔
    response = ''.join(alarms_str)
    if len(alarms_str) > 1:
        # 发送结果给用户(千寻微信框架推送)
        # send_text_msg(ROBOT_WXID, TO_WXID, response)

        # server酱推送
        send_to_server_chan(SERVER_CHAN_KEY, "Today ToDoList", response)
    else:
        print('明日没有打卡任务要做！')

    ############################################ 每日打卡任务推送 ############################################


def alarms_task_today_server_chan_v2():
    alarms_str = get_today_alarms_str()
    responses = ''.join(alarms_str)
    if len(alarms_str) > 1:
        send_to_server_chan(SERVER_CHAN_KEY, "今日打卡", responses)
    else:
        print('今天没有打卡任务要做！')


def get_today_alarms_str():
    # 获取今天的日期和星期
    today = datetime.now()
    weekday = '每周' + weekday_dict[today.strftime('%A')]
    date = '每月' + today.strftime('%d') + '号'
    # 获取当前时间
    now = datetime.now()
    # 从数据库中获取所有打卡类型的事件,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_sign_in_alarms(conn)
    # 否则，收集所有的闹钟事件
    alarms_str = []
    # 在开头添加一个大标题
    alarms_str.append('春风若有怜花意，可否许我再少年  \n' + PREFIX_STR + '  \n')
    for alarm in alarms:
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%Y-%m-%d').date()
        end_date_obj = datetime.strptime(alarm[2], '%Y-%m-%d').date()
        if start_date_obj <= now.date() <= end_date_obj:
            if alarm[4] == '每天' or alarm[4] == weekday or alarm[4] == date:
                # 将每个闹钟的信息分别添加到列表中
                alarm_info = f"【{alarm[8]}】{alarm[5]}  \n" + f"【内容】{alarm[6]}  \n" + f"【直达】{alarm[7]}  \n" + PREFIX_STR + '  \n'
                alarms_str.append(alarm_info)
    return alarms_str


############################################ 每日打卡任务状态重置 ############################################
def alarms_task_status_reset():
    print('即将进行状态重置')
    alarms_ids = get_today_ok_alarms()
    print('获取到需要重置状态的打卡任务数量为：{}'.format(len(alarms_ids)))
    # 对每个需要重置状态的打卡任务执行重置操作
    for alarm_id in alarms_ids:
        alarms_status_reset(alarm_id)


def get_today_ok_alarms():
    # 获取今天的日期和星期
    today = datetime.now()
    weekday = '每周' + weekday_dict[today.strftime('%A')]
    date = '每月' + today.strftime('%d') + '号'
    # 获取当前时间
    now = datetime.now()
    # 从数据库中获取所有打卡类型的事件,获取接下来5分钟内需要推送消息的闹钟事件
    conn = mysql_db()
    alarms = get_all_alarms(conn)
    # 否则，收集所有的闹钟事件
    alarms_ids = []
    for alarm in alarms:
        # 检查当前时间是否在闹钟时间前的5分钟，并且当前日期在闹钟的开始日期和结束日期之间
        start_date_obj = datetime.strptime(alarm[1], '%Y-%m-%d').date()
        end_date_obj = datetime.strptime(alarm[2], '%Y-%m-%d').date()
        if start_date_obj <= now.date() <= end_date_obj:
            if alarm[4] == '每天' or alarm[4] == weekday or alarm[4] == date:
                # 将每个闹钟的 ID 添加到列表中
                alarms_ids.append(alarm[0])
    return alarms_ids
